Promise
✒️ 2025-05-23 15:22 내용 수정
참고 자료 : mdn web docs javascript Promise, mdn web docs javascript using promises, javascript promise-basics
비동기 작업의 미래의 완료 또는 실패 결과 값을 나타냄
- Promise 객체는 Promise 생성 시점에는 알려지지 않은 값의 대리자(Proxy)이다.
- 비동기 연산이 종료된 이후 결과값과 실패 사유를 처리하기 위한 처리기를 연결할 수 있다.
- 비동기 메소드에서 미래의 어떤 시점에 결과를 제공한다는 약속(Promise)을 반환한다.
- 동기 메소드처럼 값을 반환하는 것처럼 보이지만 최종 결과를 반환하는 것은 아니다.
const promise = new Promise(실행할함수);
const promise = new Promise((resolve, reject) => {
// resolve()
// reject()
});
- 실행 함수는 비동기 작업을 시작한 후 모든 작업이 끝나면 resolve 함수를 호출해 Promise를 fulfilled(이행)하고, 오류가 발생하면 reject 함수를 호출해 reject(거부)한다.
- 비동기 함수의 반환 값은 Promise다.
- AsyncFunction 참고.
특징
- 함수에 callback을 전달하는 대신 callback을 첨부하는 방식의 객체다.
- Javascript 이벤트 루프가 현재 실행 중인 call stack을 완료하기 전에는 callback이 호출되지 않는다.
- 참고 자료 : mdn web docs javascript event loop run to completion
- 비동기 작업이 성공하거나 실패한 뒤에
then()을 이용해서 추가한 callback도 현재 실행 중인 call stack 완료 전까진 호출되지 않는다.
then()을 사용해서 여러 개의 callback을 추가할 수 있고, 각각의 callback은 주어진 순서대로 하나씩 실행된다.- Promise를 사용하면 비동기 방식에서 동기 방식처럼 원하는 순서대로 함수를 호출하도록 설정하는 작업을 더 간단하게 할 수 있다.
// 1. Promise를 반환하는 함수
function fetchData(success = true) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (success) {
resolve("데이터 가져오기 성공!");
} else {
reject("데이터 가져오기 실패");
}
}, 2000); // 2초 후에 실행
});
}
// 2. then / catch 구문으로 사용하기
fetchData(true)
.then((result) => {
console.log("성공:", result);
})
.catch((error) => {
console.log("에러:", error);
});
Promise Chaining
- 두 개 이상의 비동기 작업을 순차적으로 실행해야 할 때 이전 작업의 결과값을 이용해서 다음 작업을 실행하는 것으로 진행된다.
- Promise에선
then()과catch()를 사용해서 비동기 작업 이후 순차적으로 이어질 작업을 연결한다.
- Promise에선
const promise = work1();
// promise2는 work1()을 완료하고, successCallback나 failureCallback의 완료까지다.
const promise2 = promise.then(successCallback, failureCallback);
// 위의 내용을 한 번에 작성하면
const promise2 = work1().then(successCallback, failureCallback);
- 예전 방식 : 비동기 함수의 결과를 받아서 다음 함수에 작업을 넘겨주는데, 이 때 failureCallback도 설정하느라 상당히 복잡한 구조로 생성된다.
- 참고 자료(mdn web docs javascript using promises)의 사이트의 예시를 그대로 작성했다.
work1(function (result1) {
work2(result1, function (result2) {
work3(result2, function (result3) {
console.log(result3);
}, failureCallback);
}, failureCallback);
}, failureCallback);
- Promise를 사용했을 때 : 이전 코드보다 각 함수들의 작동을 확인하기 쉽다.
- 특히 failureCallback의 개수를 비교하면 위의 코드는 총 3번이나 등장하지만, Promise를 사용했을 때는 1번만 지정해주면 된다.
work1()
.then(function (result) {
return work2(result);
})
.then(function (result2) {
sreturn work3(result3);
})
.then(function (result3) {
console.log(result3);
})
.catch(failureCallback);
// 화살표 함수로 바꾸면
work1()
.then((result) => work2(result))
.then((result2) => work3(result2))
.then((result3) => {
console.log(result3);
})
.catch(failureCallback);
Promise의 상태
| 상태 | 설명 |
|---|---|
pending(대기) |
초기 상태 |
fulfilled(이행) |
연산이 성공적으로 완료됨 |
rejected(거부) |
연산이 실패됨 |
pending상태의 Promise는 값을 가지고fulfilled상태가 되거나, 오류로 인해rejected상태가 될 수 있다.- Promise의 상태가
fulfilled로 바뀌거나rejected로 바뀔 때then메소드에 의해서 대기열에 추가된 처리기(associated handlers)가 호출된다. settled(처리됨) : Promise가pending상태가 아닌fulfilled상태거나rejected상태일 때를 말하며, 대기 상태가 아닌 어떤 상태더라도 일단 Promise를 처리한 것을 의미한다.(실제 상태가 아닌 언어적 표현)
- Promise의 상태가
resolved: Promise가setteld되었거나(즉fulfilled상태나rejected상태가 됨), 다른 Promise의 상태의 상태에 맞춰 상태가 잠긴 것(locked-in) 을 말한다.
Instance method
then()- Promise에
fulfilled와rejected일 때의 callback을 추가한다. - 참고 자료 : mdn web docs Javascript Promise then
- Promise에
promiseInstance
.then(
function(result) {
// onFulfilled일 때 실행할 함수
},
function(error) {
// onRejected일 때 실행할 함수, 선택 사항
}
)
- 함수가 값을 반환하면
then()에서 반환한 Promise는 그 함수의 반환값을 자신의 결과값으로 해서fulfill(이행) 한다.- 함수의 반환값이 없다면 Promise는
undefined로fulfill한다. - 오류가 발생하면 Promise는 그 오류를 자신의 결과값으로 해서
reject(거부)한다.
- 함수의 반환값이 없다면 Promise는
- 이미
fullfilled된 Promise나rejected된 Promise를 반환 받아 chain을 한 경우,then()에서 반환한 Promise는 이전 Promise의 결과값을 자신의 결과값으로 해서fulfill하거나reject한다. - 대기 중인 Promise를 반환 받아 chain을 한 경우,
then()에서 반환한 Promise는 이전 Promise의fulfill여부과 결과값을 따른다. then()메서드는 새로 생성된 Promise 객체를 반환하기 때문에 여러 개의then()메서드를 연결할 수 있다.
var test = new Promise(function (resolve, reject) {
resolve('test 성공');
})
test.then(
function (value) {
console.log(value);
},
function (reason) {
console.log(reason);
}
)

catch()- Promise에
rejected일 때의 callback을 추가한다. then(null, failureCallback)과 동일하다.- 참고 자료 : mdn web docs Javascript Promise catch
- 새 Promise를 반환하며, 현재 Promise의 상태와 무관하게 반환될 때 항상
pending상태이다. - 현재 Promise가
fulfilled상태라면 callback 함수를 호출하지 않고, 반환된 Promise는 이전 Promise와 같은 값을 그대로fulfill(이행)한다.
- Promise에
- callback 함수가 호출되었다면 반환된 Promise는 현재 호출의 반환값에 맞춰
resolve하거나reject된다.
promiseInstance.catch(
function(reason) {
// rejected 일 때 실행할 callback
}
)
var test = new Promise(function (resolve, reject) {
resolve('test 성공?');
})
test.then(
function (value) {
console.log(value);
throw new Error('에러 발생');
})
.catch(
function (reason) {
console.log(reason);
}
)

finally()
- Promise가 처리되면
fulfilled나rejected상태 여부와 관계 없이 지정된 callback을 실행한다.- try-catch-finally 문과 비슷하다.
- Promise가 처리된 후 무조건 한 번 실행해야 하는 코드가 있을 때 사용한다.
- 참고 자료 : mdn web docs Javascript Promise finally
- Promise가 처리된 후 호출된 함수의 Promise를 반환한다.
finally의 callback은 Promise가 어떤 상태인지 알 수 없기 때문에 인수를 전달 받지 않는다.
promiseInstance.finally(
function() { // settled(fulfilled나 rejected)일 때 실행할 내용
}
)
- 먼저 Promise가
fulfilled된 경우의 finally 호출을 확인한다.
var test = new Promise(function (resolve, reject) {
resolve('test 성공?');
})
test.then(
function (value) {
console.log(value);
})
.catch(
function (reason) {
console.log(reason);
}
)
.finally(
function() {
console.log('Promise 테스트 완료');
}
)

- 이번엔 Promise가
rejected된 경우의 finally 호출을 확인한다.
var test = new Promise(function (resolve, reject) {
resolve('test 성공?');
})
test.then(
function (value) {
console.log(value);
// throw new Error('에러 발생');
})
.catch(
function (reason) {
console.log(reason);
}
)
.finally(
function() {
console.log('Promise 테스트 완료');
}
)

정적 메소드
| 메소드 | 설명 |
|---|---|
all(iterable) |
주어진 모든 Promise가 fulfilled되거나 rejected될 때까지 pending하는 새 Promise 반환 |
allSettled(iterable) |
주어진 모든 Promise가 settled(처리)될 때까지 pending하는 새 Promise 반환 |
any(iterable) |
주어진 모든 Promise 중 하나라도 fulfill되면 즉시 그 값으로 fulfill하는 새 Promise 반환 |
race(iterable) |
주어진 모든 Promise 중 하나라도 settled될 까지 pending하는 Promise 반환 |
reject(reason) |
주어진 reason로 reject하는 Promise 반환 |
resolve() |
주어진 value로 fulfill하는 Promise 반환 |
all()- 주어진 모든 Promise가
fulfilled되거나rejected될 때까지pending하는 새 Promise를 반환 한다. - 참고 자료 : mdn seb docs Javascript Promise all
- 순회 가능한 객체(ex: 배열)에 주어진 모든 Promise가
fulfilled된 후, 혹은 Promise가 주어지지 않았을 때fulfill하는 Promise를 반환 한다.- 매개변수로 전달한 Promise 각각의
fulfilled된 결과값을 모두 모은 배열로 Promise를fulfill한다.
- 매개변수로 전달한 Promise 각각의
- 주어진 Promise 중 하나가
reject되면 첫 번째로reject한 Promise의 이유를 사용해 이후 Promise들도reject한다. - 각각의 Promise가 서로 연관이 있거나 하나만
reject되어도 즉시 전체가reject되어야 하는 경우에 사용한다.
- 주어진 모든 Promise가
- 예시는 참고 자료 사이트의 예시를 사용했다.
// 배열같은 순회 가능 객체를 전달.
// Promise로 된 배열을 전달할 수 있음
Promise.all(iterable);
const promise1 = Promise.resolve(10);
const promise2 = 4;
const promise3 = new Promise((resolve, reason) => {
setTimeout(resolve, 100, '3번째 promise');
});
Promise.all([promise1, promise2, promise3])
.then(
(values) => {console.log(values);}
);

allSettled()- 주어진 모든 Promise가
settled(fulfilled되거나rejected)될 때까지pending하는 새 Promise를 반환한다. - 참고 자료 : mdn web docs Javascript Promise allSetteled
- 매개변수로 전달한 순회 가능 객체의 Promise들이 서로의 성공/실패 여부와 관련 없이 여러 비동기 작업을 수행하거나, 항상 각 Promise의 실행 결과를 확인하고 싶을 때 사용한다.
- 주어진 모든 Promise가
- 예시는 참고 자료 사이트의 예시를 사용했다.
// 배열같은 순회 가능 객체를 전달
// Promise로 된 배열을 전달할 수 있음
Promise.allSettled(iterable);
const promise1 = Promise.resolve(10);
const promise2 = 4;
const promise3 = new Promise((resolve, reason) => {
setTimeout(resolve, 100, '3번째 promise');
throw new Error('3번째는 실패!');
});
Promise.allSettled([promise1, promise2, promise3])
.then(
(values) => {console.log(values);}
);

any()- 주어진 모든 Promise 중 하나라도
fulfill되면 즉시 그 값으로fulfill하는 새 Promise를 반환 한다. - 참고 자료 : mdn web docs Javascript Promise any
- 매개변수로 전달한 순회 가능 객체 내의 모든 Promise가
reject되면 에러가 발생한다.
- 주어진 모든 Promise 중 하나라도
- 예시는 참고 자료 사이트의 예시를 사용했다.
// 배열같은 순회 가능 객체를 전달
// Promise로 된 배열을 전달할 수 있음
Promise.any(iterable);
const promise1 = Promise.reject(0);
const promise2 = 400;
const promise3 = new Promise((resolve, reason) => {
setTimeout(resolve, 100, '3번째 promise');
throw new Error('3번째는 실패!');
});
Promise.any([promise1, promise2, promise3])
.then(
(values) => {console.log(values);}
);

race()- 주어진 모든 Promise 중 하나라도
settled(fulfilled되거나rejected)될 까지pending하는 Promise를 반환 한다. - 참고 자료 : mdn web docs Javascript Promise race
- 매개변수로 전달한 순회 가능 객체 내의 Promise 중에서 가장 먼저 처리가 완료된 Promise의 결과값을 그대로
fulfill하거나reject한다.race()에서 반환하는 Promise는 순회 가능 객체 내의 Promise의 값을 비동기적으로 전달 받는pending상태의 Promise다.- 따라서 전달 받을 순회 가능 객체가 비어있으면 반환한 Promise는 계속
pending상태다.
- 주어진 모든 Promise 중 하나라도
- 예시는 참고 자료 사이트의 예시를 사용했다.
// 배열같은 순회 가능 객체를 전달
// Promise로 된 배열을 전달할 수 있음
Promise.race(iterable);
const promise1 = new Promise((resolve, reason) => {
setTimeout(resolve, 500, '1번 Promise는 5초');
});
const promise2 = new Promise((resolve, reason) => {
setTimeout(resolve, 300, '2번 Promise는 3초');
});
Promise.race([promise1, promise2])
.then((value) => {
console.log(value);
})

reject()- 주어진 reason로
reject하는 Promise 반환 한다. - 참고 자료 : mdn web docs Javascript Promise reject
- 디버깅 목적 및 오류를 잡기 위해 Error 생성자의 인스턴스를 전달해서 사용할 수 있다.
- 주어진 reason로
- 예시는 참고 자료 사이트의 예시를 사용했다.
// reason : Promise가 reject된 이유
Promise.reject(reason);
Promise.reject("reject()를 테스트")
.then(
function (result) {
console.log("---이행했을 때 : " + result);
},
function (reason) {
console.log("---거부됬을 때 : " + reason);
}
);

resolve()- 주어진 value로
fulfill하는 Promise를 반환 한다. - 참고 자료 : mdn web docs Javascript Promise resolve
- 지정한 값이
then()을 사용할 수 있는 Promise이나 thenable와 같은 값이라면,resolve()로 반환되는 Promise는then()메소드를 따라가서 자신의 최종 상태를 결정한다.- 스스로 결정하는 thenable에서
resolve()를 호출하면 무한히 Promise를 펼치려 해서 무한 재귀 호출이 일어날 수 있으므로 주의해야 한다. - 재귀 호출은 메서드(Methods)#재귀호출 참고.
- 스스로 결정하는 thenable에서
- 그 외의 경우에는 반환된 Promise는
resolve()로 전달한 값으로fulfill된다.
- 주어진 value로
- 예시는 참고 자료 사이트의 예시를 사용했다.
Promise.resolve(value); // 값을 전달
const promise1 = Promise.resolve(51);
const promise2 = Promise.resolve('resolve()를 테스트함');
promise1.then((value) => {
console.log(value);
});
promise2.then((value) => {
console.log(value);
});
